package com.sam.provider;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.sam.provider.imp.provider.ListServiceProvider;
import com.sam.provider.interfaces.provider.Provider;
import com.sam.provider.interfaces.service.Service;

/**
 * 
 * <b>项目名称</b>：effectiveJava<br>
 * <b>类名称</b>：Services<br>
 * <b>类描述</b>：服务注册最简单模型<br>
 * <b>创建人</b>：SAM QZL<br>
 * <b>创建时间</b>：2017-6-7 下午2:14:09<br>
 * <b>修改人</b>：SAM QZL<br>
 * <b>修改时间</b>：2017-6-7 下午2:14:09<br>
 * <b>修改备注</b>：<br>
 * @author SAM QZL<br>
 * @version
 * 
 */
public final class Services {

    /** 构造函数私有 **/
    private Services() {

    }

    /** 服务提供线程安全集合 **/
    private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>();
    /** 默认服务提供者 **/
    public static final String DEFAULT_PROVIDER_NAME = "<def>";

    /** 默认提供者注册api **/
    public static void regesiterProvider(Provider p) {

        regesiterProvider(DEFAULT_PROVIDER_NAME, p);
    }

    /** 提供者注册api **/
    public static void regesiterProvider(String name, Provider p) {

        /** 注册 **/
        providers.put(name, p);
    }

    /** 服务访问api **/
    public static Service newInstance(String name) {

        /** 获取服务提供者 **/
        Provider p = providers.get(name);
        /** 如果没有注册 **/
        if (p == null) {
            throw new IllegalArgumentException("No provider regestered with name :" + name);
        }
        /** 返回提供者的服务 **/
        return p.newService();
    }

    /** 默认访问api **/
    public static Service newInstance() {

        return newInstance(DEFAULT_PROVIDER_NAME);
    }

    public static void main(String args[]) throws Exception {

        Services.regesiterProvider(new ListServiceProvider());
        System.out.println(Services.newInstance().getList(100).getClass());
    }
}
